package com.ruifu.act.listener;

import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.ImplementationType;
import org.activiti.bpmn.model.MultiInstanceLoopCharacteristics;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.handler.UserTaskParseHandler;
import org.springframework.stereotype.Component;

@Component
public class MultipleUserTaskParseHandler extends UserTaskParseHandler {

    @Override
    protected void executeParse(BpmnParse bpmnParse, UserTask userTask) {
        super.executeParse(bpmnParse, userTask);

        // MultiInstanceLoopCharacteristics继承自BaseElement，多实例元素节点。
        // 可以获取到实例完成条件等参数值
        // 这里使用配置插入监听事件，而不是让用户手动配置TaskListner
        if (userTask.getLoopCharacteristics() instanceof MultiInstanceLoopCharacteristics) {

            //1.添加多实例task的create事件，在默认初始化节点之前，进行用户组分配的工作
            ActivitiListener createListener = new ActivitiListener();
            createListener.setEvent(TaskListener.EVENTNAME_CREATE);

            //配置delegate表达式,将对应监听添加到当前的任务中，当然，这里你也可以在这里添加些其他需要的监听
            //注意，多实例每次创建该节点下的新任务就会调用一次该监听器
            createListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
            createListener.setImplementation("#{multipleTaskCreateListener}");
            userTask.getTaskListeners().add(createListener);

            //2.添加多实例task的complete事件，在单个实例完成之后，动态进行驳回操作
            ActivitiListener completeListener = new ActivitiListener();
            completeListener.setEvent(TaskListener.EVENTNAME_COMPLETE);

            completeListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
            completeListener.setImplementation("#{multipleTaskCompleteListener}");
            userTask.getTaskListeners().add(completeListener);
        }
    }
}